package datastruct

import "fmt"

type Node struct {
	value int
	left  *Node
	right *Node
}

// 打印树结构
func (node *Node) Print() {
	fmt.Printf("%d ", node.value)
}

// 设置树节点值
func (node *Node) SetValue(value int) {
	node.value = value
}

// 创建一个树节点
func CreateNode(value int) *Node {
	return &Node{value, nil, nil}
}

// 查找节点
func (node *Node) FindNode(n *Node, x int) *Node {
	if n == nil {
		return nil
	}
	if n.value == x {
		return n
	}

	// 进行递归查找子节点
	p := node.FindNode(n.left, x)
	if p != nil {
		return p
	}
	return node.FindNode(n.right, x)
}

// 获取树高度
func (node *Node) getTreeHeight(n *Node) int {
	if n == nil {
		return 0
	}
	lHeight := node.getTreeHeight(n.left)
	rHeight := node.getTreeHeight(n.right)
	if lHeight > rHeight {
		return lHeight + 1
	}

	return rHeight + 1
}

// 前序遍历
func (node *Node) PreEach(n *Node) {
	if n == nil {
		fmt.Println("前序遍历结束")
		return
	}
	fmt.Printf("%d ", n.value)
	node.PreEach(n.left)
	node.PreEach(n.right)
}

// 中序遍历
func (node *Node) MidEach(n *Node) {
	if n == nil {
		fmt.Println("中序遍历结束")
		return
	}
	node.MidEach(n.left)
	fmt.Printf("%d ", n.value)
	node.MidEach(n.right)
}

// 后序排序
func (node *Node) LastEach(n *Node) {
	if n == nil {
		fmt.Println("后序遍历结束")
		return
	}
	node.LastEach(n.left)
	node.LastEach(n.right)
	fmt.Printf("%d ", n.value)
}

// 获取所有子节点
func (node *Node) GetLeafNode(n *Node) {
	if n == nil {
		fmt.Println("获取所有子节点完成")
		return
	}

	if n.left != nil && n.right != nil {
		fmt.Printf("%d ", n.value)
	}
}